/*
 * ATM Example system - file Deposit.java   
 *
 * copyright (c) 2001 - Russell C. Bjork
 *
 */
 
package atm.transaction;
import atm.ATM;
import atm.Session;
import atm.physical.*;
import banking.AccountInformation;
import banking.Card;
import banking.Message;
import banking.Money;
import banking.Status;
import banking.Receipt;

/** Representation for a deposit transaction
 */
public class Deposit extends Transaction
{
    /** Constructor
     *
     *  @param atm the ATM used to communicate with customer
     *  @param session the session in which the transaction is being performed
     *  @param card the customer's card
     *  @param pin the PIN entered by the customer
     */
    public Deposit(ATM atm, Session session, Card card, int pin)
    {
        super(atm, session, card, pin);
    }
    
    /** Get specifics for the transaction from the customer
     *
     *  @return message to bank for initiating this transaction
     *  @exception CustomerConsole.Cancelled if customer cancelled this transaction
     */
    protected Message getSpecificsFromCustomer() throws CustomerConsole.Cancelled
    {
        to = atm.getCustomerConsole().readMenuChoice(
            "Account to deposit to",
            AccountInformation.ACCOUNT_NAMES);

        amount = atm.getCustomerConsole().readAmount("Amount to deposit");
        
        return new Message(Message.INITIATE_DEPOSIT,
                           card, pin, serialNumber, -1, to, amount);
    }
    
    /** Complete an approved transaction
     *
     *  @return receipt to be printed for this transaction
     *  @exception CustomerConsole.Cancelled if customer cancelled or 
     *             transaction timed out
     */
    protected Receipt completeTransaction() throws CustomerConsole.Cancelled
    {
        atm.getEnvelopeAcceptor().acceptEnvelope();
        Status status = atm.getNetworkToBank().sendMessage(
            new Message(Message.COMPLETE_DEPOSIT,
                        card, pin, serialNumber, -1, to, amount), 
            balances);
            
        return new Receipt(this.atm, this.card, this, this.balances) {
            {
                detailsPortion = new String[2];
                detailsPortion[0] = "DEPOSIT TO: " + 
                                    AccountInformation.ACCOUNT_ABBREVIATIONS[to];
                detailsPortion[1] = "AMOUNT: " + amount.toString();
            }
        };
    }
    
    /** Account to deposit to
     */ 
    private int to;
    
    /** Amount of money to deposit
     */
    private Money amount;
            
}